/**
 * @file controlpanel.cpp
 * @brief 控制面板组件实现文件
 *
 * 实现算法参数设置界面的具体功能：
 * - 界面布局和控件创建
 * - 参数同步和信号发射
 * - 用户交互处理
 */

#include "controlpanel.h"
#include <QVBoxLayout>   // 垂直布局
#include <QHBoxLayout>   // 水平布局
#include <QGroupBox>     // 分组框
#include <QComboBox>     // 下拉选择框
#include <QSlider>       // 滑动条
#include <QSpinBox>      // 数字输入框
#include <QPushButton>   // 按钮
#include <QLabel>        // 标签

/**
 * @brief 构造函数
 * @param parent 父窗口部件
 *
 * 初始化控制面板：
 * - 设置固定宽度
 * - 构建用户界面
 * - 连接信号槽
 */
ControlPanel::ControlPanel(QWidget *parent)
    : QWidget(parent)
{
    setupUI();                    // 构建用户界面
    setMaximumWidth(300);         // 控制面板固定宽度
}

/**
 * @brief 初始化用户界面
 *
 * 构建控制面板的完整界面布局：
 * 1. 主布局：垂直布局
 * 2. 算法选择分组
 * 3. 画笔设置分组
 * 4. 开始修复按钮
 */
void ControlPanel::setupUI()
{
    // 主布局 - 垂直排列各个分组
    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    // ==================== 算法选择分组 ====================
    QGroupBox *algorithmGroup = new QGroupBox("修复算法");
    QVBoxLayout *algorithmLayout = new QVBoxLayout(algorithmGroup);

    // 创建算法选择下拉框
    algorithmCombo = new QComboBox();
    algorithmCombo->addItem("快速行进法 (FMM)", "FMM");        // 显示文本和内部数据
    algorithmCombo->addItem("Criminisi 算法", "Criminisi");    // 待实现算法
    algorithmCombo->addItem("深度学习", "DeepLearning");       // 待实现算法

    // 添加标签和下拉框到布局
    algorithmLayout->addWidget(new QLabel("选择算法:"));
    algorithmLayout->addWidget(algorithmCombo);

    // ==================== 画笔设置分组 ====================
    QGroupBox *brushGroup = new QGroupBox("画笔设置");
    QVBoxLayout *brushLayout = new QVBoxLayout(brushGroup);

    // 画笔大小显示标签
    brushSizeLabel = new QLabel("画笔大小: 20");

    // 画笔大小滑动条 - 水平方向
    brushSizeSlider = new QSlider(Qt::Horizontal);
    brushSizeSlider->setRange(5, 100);   // 取值范围5-100像素
    brushSizeSlider->setValue(20);       // 默认值20像素

    // 画笔大小数字输入框
    brushSizeSpinBox = new QSpinBox();
    brushSizeSpinBox->setRange(5, 100);  // 取值范围5-100
    brushSizeSpinBox->setValue(20);      // 默认值20

    // 水平布局放置滑动条和数字框
    QHBoxLayout *brushSizeLayout = new QHBoxLayout();
    brushSizeLayout->addWidget(brushSizeSlider);
    brushSizeLayout->addWidget(brushSizeSpinBox);

    // 将控件添加到画笔分组布局
    brushLayout->addWidget(brushSizeLabel);
    brushLayout->addLayout(brushSizeLayout);

    // ==================== 开始修复按钮 ====================
    startButton = new QPushButton("开始修复");
    // 使用样式表设置按钮外观（绿色背景，白色文字）
    startButton->setStyleSheet("QPushButton { background-color: #4CAF50; color: white; font-weight: bold; padding: 8px; }");

    // ==================== 组装主布局 ====================
    mainLayout->addWidget(algorithmGroup);   // 算法选择分组
    mainLayout->addWidget(brushGroup);       // 画笔设置分组
    mainLayout->addStretch(1);               // 弹性空间，推动按钮到底部
    mainLayout->addWidget(startButton);      // 开始修复按钮

    // ==================== 连接信号和槽 ====================

    // 画笔大小滑动条和数字框双向同步
    connect(brushSizeSlider, &QSlider::valueChanged, brushSizeSpinBox, &QSpinBox::setValue);
    connect(brushSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), brushSizeSlider, &QSlider::setValue);

    // 画笔大小变化处理
    connect(brushSizeSlider, &QSlider::valueChanged, this, &ControlPanel::onBrushSizeChanged);

    // 开始修复按钮点击
    connect(startButton, &QPushButton::clicked, this, &ControlPanel::startInpainting);
}

/**
 * @brief 画笔大小改变处理函数
 * @param value 新的画笔大小值
 *
 * 更新界面显示并发射画笔大小改变信号
 */
void ControlPanel::onBrushSizeChanged(int value)
{
    // 更新标签显示
    brushSizeLabel->setText(QString("画笔大小: %1").arg(value));

    // 发射画笔大小改变信号，通知其他组件
    emit brushSizeChanged(value);
}

/**
 * @brief 获取当前选择的算法
 * @return 算法标识字符串（"FMM", "Criminisi", "DeepLearning"）
 *
 * 从下拉框的当前项数据中获取算法标识
 */
QString ControlPanel::getSelectedAlgorithm() const
{
    return algorithmCombo->currentData().toString();
}

/**
 * @brief 获取当前画笔大小
 * @return 画笔大小值（像素）
 */
int ControlPanel::getBrushSize() const
{
    return brushSizeSlider->value();
}
